#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Excel工作表合并脚本
功能：将Excel文件中除第一个工作表外的所有其他工作表的内容合并到第一个工作表中
作者：zhangweijun
日期：2025-10-17
"""

import pandas as pd
import os
import sys
from pathlib import Path


def merge_excel_sheets(input_file, output_file=None, overwrite=False):
    """
    合并Excel文件中的所有工作表到第一个工作表
    
    参数:
        input_file (str): 输入Excel文件路径
        output_file (str, optional): 输出Excel文件路径，默认为None（自动生成）
        overwrite (bool): 是否覆盖原文件，默认为False
    
    返回:
        bool: 成功返回True，失败返回False
    """
    
    # 1. 验证输入文件
    if not os.path.exists(input_file):
        print(f"❌ 错误：文件不存在 - {input_file}")
        return False
    
    if not input_file.endswith(('.xlsx', '.xls')):
        print(f"❌ 错误：不支持的文件格式，仅支持.xlsx或.xls文件")
        return False
    
    print(f"📖 正在读取文件: {input_file}")
    
    try:
        # 2. 读取Excel文件的所有工作表
        excel_file = pd.ExcelFile(input_file)
        sheet_names = excel_file.sheet_names
        
        # 检查是否有工作表
        if len(sheet_names) == 0:
            print(f"❌ 错误：Excel文件中没有工作表")
            return False
        
        print(f"📊 发现 {len(sheet_names)} 个工作表: {sheet_names}")
        
        # 如果只有一个工作表，无需合并
        if len(sheet_names) == 1:
            print(f"⚠️  警告：只有一个工作表，无需合并")
            return True
        
        # 3. 读取第一个工作表（包含表头）
        first_sheet_name = sheet_names[0]
        print(f"\n🔹 读取第一个工作表: {first_sheet_name}")
        
        first_df = pd.read_excel(input_file, sheet_name=first_sheet_name)
        
        # 检查第一个工作表是否为空
        if first_df.empty:
            print(f"⚠️  警告：第一个工作表为空")
        else:
            print(f"   ✓ 行数: {len(first_df)}, 列数: {len(first_df.columns)}")
            print(f"   ✓ 列名: {list(first_df.columns)}")
        
        # 4. 读取并合并其他工作表
        merged_df = first_df.copy()
        total_added_rows = 0
        
        for i, sheet_name in enumerate(sheet_names[1:], start=2):
            print(f"\n🔹 处理第 {i} 个工作表: {sheet_name}")
            
            try:
                # 读取工作表
                current_df = pd.read_excel(input_file, sheet_name=sheet_name)
                
                # 检查是否为空
                if current_df.empty:
                    print(f"   ⚠️  工作表为空，跳过")
                    continue
                
                # 检查列是否匹配
                if list(current_df.columns) != list(first_df.columns):
                    print(f"   ⚠️  警告：列名不匹配")
                    print(f"      第一个工作表列: {list(first_df.columns)}")
                    print(f"      当前工作表列: {list(current_df.columns)}")
                    print(f"   ⚠️  尝试按位置对齐列...")
                    # 重命名列以匹配第一个工作表
                    current_df.columns = first_df.columns
                
                # 追加数据（不包括表头）
                rows_before = len(merged_df)
                merged_df = pd.concat([merged_df, current_df], ignore_index=True)
                rows_added = len(merged_df) - rows_before
                total_added_rows += rows_added
                
                print(f"   ✓ 已追加 {rows_added} 行数据")
                
            except Exception as e:
                print(f"   ❌ 处理工作表 '{sheet_name}' 时出错: {str(e)}")
                continue
        
        # 5. 保存合并后的结果
        print(f"\n📝 合并完成！")
        print(f"   总计: {len(merged_df)} 行数据（原 {len(first_df)} 行 + 新增 {total_added_rows} 行）")
        
        # 确定输出文件路径
        if output_file is None:
            if overwrite:
                output_file = input_file
            else:
                # 自动生成输出文件名
                input_path = Path(input_file)
                output_file = str(input_path.parent / f"{input_path.stem}_merged{input_path.suffix}")
        
        print(f"\n💾 正在保存到: {output_file}")
        
        # 保存到Excel文件
        with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
            merged_df.to_excel(writer, sheet_name=first_sheet_name, index=False)
        
        print(f"✅ 成功保存合并后的文件！")
        print(f"   文件大小: {os.path.getsize(output_file) / 1024:.2f} KB")
        
        return True
        
    except PermissionError:
        print(f"❌ 错误：没有权限访问文件，请确保文件未被其他程序打开")
        return False
    except Exception as e:
        print(f"❌ 发生错误: {str(e)}")
        import traceback
        traceback.print_exc()
        return False


def main():
    """
    主函数：处理命令行参数并执行合并操作
    """
    print("="*60)
    print("📊 Excel工作表合并工具")
    print("="*60)
    
    # 命令行参数处理
    if len(sys.argv) < 2:
        print("\n使用方法:")
        print(f"  python {sys.argv[0]} <输入文件> [输出文件] [--overwrite]")
        print("\n参数说明:")
        print("  <输入文件>   : 必需，要合并的Excel文件路径")
        print("  [输出文件]   : 可选，合并后保存的文件路径")
        print("  [--overwrite]: 可选，覆盖原文件")
        print("\n示例:")
        print(f"  python {sys.argv[0]} data.xlsx")
        print(f"  python {sys.argv[0]} data.xlsx merged_data.xlsx")
        print(f"  python {sys.argv[0]} data.xlsx --overwrite")
        print("")
        return
    
    # 解析参数
    input_file = sys.argv[1]
    output_file = None
    overwrite = False
    
    if len(sys.argv) > 2:
        if sys.argv[2] == '--overwrite':
            overwrite = True
        else:
            output_file = sys.argv[2]
            if len(sys.argv) > 3 and sys.argv[3] == '--overwrite':
                overwrite = True
    
    # 执行合并
    print(f"\n配置信息:")
    print(f"  输入文件: {input_file}")
    print(f"  输出文件: {output_file if output_file else '自动生成'}")
    print(f"  覆盖模式: {'是' if overwrite else '否'}")
    print("")
    
    success = merge_excel_sheets(input_file, output_file, overwrite)
    
    print("\n" + "="*60)
    if success:
        print("🎉 操作完成！")
    else:
        print("😞 操作失败，请检查错误信息")
    print("="*60)


if __name__ == "__main__":
    main()
